class ValuePair{ //存储原始值
    constructor(key,value) { //单个的字典值的节点
        this.key = key
        this.value = value
    }
    toString(){
        return `[${this.key}:${this.value}]` //单个值节点转成字符串
    }
}

class Dictionary{
    constructor(){
        this.table = {} //这个对象就是存储数据的内存空间，key就是内存地址，value就是里面的值
    }
    toStringFN(item){ //形参item就等同于key意思
        if(item === null){ //如果传入的key是null
            return ""
        }else if(item === undefined){ //如果传入的是undefined
            return "Undefined"
        }else if(typeof item === "string" || item instanceof String){ //如果传入的是与字符串有关的
            return `${item}`
        }
        //如果以上情况都不是
        return item.toString()
    }
    hasKey(key){ //判断是否已经在对象中存储了这个值
        return this.table[this.toStringFN(key)] !== undefined
        //因为我们访问的是 已经存在的对象 的key，访问对象的属性，如果返回的不是undefined，则表示存在，返回undefined则表示不存在
    }
    set(key,value){ //往字典里面存储值
        //先判断是否存在
        if(key != null && value != null){
            let tablekey = this.toStringFN(key) //得到一个key
            this.table[tablekey] = new ValuePair(key,value) //存储值
        }
        return false //如果为空返回false
    }
    remove(key){ //删除字典里的某个key所指向的值
        //删除一个值前提是得有这个值
        if(this.hasKey(key)){
            delete this.table[this.toStringFN(key)] //如果有这个值则删除
        }
        return false //没有则返回false
    }
    get(key){ //根据传入的key获取对应的值
        return this.table[this.toStringFN(key)]
    }
    keyValues(){ //获取所有名值对
        let ValuePairs = []
        for(let k in this.table){
            if(this.hasKey(key)){
                ValuePairs.push(this.table[k])
            }
        }
        return ValuePairs
    }
    keys(){ //获取所有名值对的key名
        return this.keyValues().map(item => item.key)
    }
    values(){ //获取所有名值对的value值
        return this.keyValues().map(item => item.value)
    }
    forEach(cb){ //遍历，接收一个回调函数
        let valuePairs = this.keyValues()
        for(let index = 0; index < valuePairs.length; index++){
            cb(index,valuePairs[index].value,valuePairs) //index item arr 这里我改了第二个valuePairs[index].value
        }
    }
    size(){ //获取长度
        return this.keyValues().length
    }
    clear(){ //清空
        this.table = {}
    }
    isEmpty(){ //是否为空
        return this.size() === 0 //如果长度为0则表示是空
    }
    toString(){
        if(this.isEmpty()){
            return ""
        }
        let valuePairs = this.keyValues()
        let objStr = ""
        for(let i = 0; i < valuePairs.length; i++){
            objStr = `${objStr},${valuePairs[i].toStringFN()}` //这里我改了最后的toStringFN
        }
        return objStr.slice(1) //去掉前面的逗号
    }
}

let d = new Dictionary()
d.set({x:1},"x：1，第1个")
d.set({x:1},"x：1，第2个") //这样子第二个会把第一个覆盖掉